package com.shwread.httpsdk.util;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.webkit.WebView;


/**
 * @Title: NetUtil.java
 * @Package com.surfingread.httpsdk.util
 * @Description: TODO(添加描述)
 * @author 刘章
 * @date 2014年1月26日 上午10:51:07
 */
public class NetUtil
{
	public static final byte    CURRENT_NETWORK_TYPE_NONE   = 0;
	
	/*
	 * 根据APN区分网络类型
	 */
	public static final byte    CURRENT_NETWORK_TYPE_NOTE2WIFI   = 0;       //坑爹的note2 wifi
	public static final byte    CURRENT_NETWORK_TYPE_WIFI   = 1;       //wifi
	public static final byte    CURRENT_NETWORK_TYPE_CTNET  = 2;       //ctnet
	public static final byte    CURRENT_NETWORK_TYPE_CTWAP  = 3;       //ctwap
	public static final byte    CURRENT_NETWORK_TYPE_CMWAP  = 4;       //cmwap
	public static final byte    CURRENT_NETWORK_TYPE_UNIWAP = 5;       //uniwap,3gwap
	public static final byte    CURRENT_NETWORK_TYPE_CMNET  = 6;       //cmnet
	public static final byte    CURRENT_NETWORK_TYPE_UNIET  = 7;       //uninet,3gnet
	                                                                    
	private static final String CONNECT_TYPE_WIFI           = "wifi";
	private static final String CONNECT_TYPE_CTNET          = "ctnet";
	private static final String CONNECT_TYPE_CTWAP          = "ctwap";
	private static final String CONNECT_TYPE_CMNET          = "cmnet";
	private static final String CONNECT_TYPE_CMWAP          = "cmwap";
	private static final String CONNECT_TYPE_UNIWAP         = "uniwap";
	private static final String CONNECT_TYPE_UNINET         = "uninet";
	private static final String CONNECT_TYPE_UNI3GWAP       = "3gwap";
	private static final String CONNECT_TYPE_UNI3GNET       = "3gnet";
	
	public static final byte    IS_NONE                     = 0;
	public static final byte    IS_CT                       = 1;       //电信
	public static final byte    IS_CM                       = 2;       //移动
	public static final byte    IS_UNI                      = 3;       //联通
	                                                                    
	//Http请求出错
	public static final int     NetError                    = -3;
	//Http重置
	public static final int     NetResetByPeer				= -2;
	//Http请求无网络
	public static final int     NetNotConnectioned          = -1;
	//Http请求超时
	public static final int     NetTimeOut                  = 0;
	
	/**
	 * @Title: isChinaTelecom
	 * @Description:通过IMSI判断是否是电信手机
	 * @param @param context
	 * @param @return 设定文件
	 * @return boolean 返回类型
	 * @throws
	 * @date 2014年2月7日 上午11:38:03
	 */
	public static byte isChinaTelecom(Context context) {
		TelephonyManager telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
		String imsi = telManager.getSubscriberId();
		int phoneType = telManager.getPhoneType();
		if (imsi != null && imsi.length() > 0)
		{
			if (imsi.startsWith("46000") || imsi.startsWith("46002") || TelephonyManager.PHONE_TYPE_GSM == phoneType)
			{//因为移动网络编号46000下的IMSI已经用完，所以虚拟了一个46002编号，134/159号段使用了此编号   
			 //中国移动   
				return IS_CM;
			}
			else if (imsi.startsWith("46001") || TelephonyManager.PHONE_TYPE_GSM == phoneType)
			{
				//中国联通   
				return IS_UNI;
			}
			else if (imsi.startsWith("46003") || imsi.startsWith("45502") || TelephonyManager.PHONE_TYPE_CDMA == phoneType)
			{//455-02  中國電信澳門    
			 //中国电信   
				return IS_CT;
			}
		}
		return IS_NONE;
	}
	
	/**
	 * @Title: getNetType
	 * @Description: 判断连接的网络类型
	 * @param @param context
	 * @param @return 设定文件
	 * @return byte 返回类型
	 * @throws
	 * @date 2014年2月7日 下午12:19:42
	 */
	public static byte getNetType(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo networkInfo = cm.getActiveNetworkInfo();
		byte type = CURRENT_NETWORK_TYPE_NONE;
		String typeName = networkInfo.getExtraInfo();
		if (TextUtils.isEmpty(typeName))
		{
			typeName = networkInfo.getTypeName();
		}
		if (!TextUtils.isEmpty(typeName))
		{
			String temp = Util.NUllToString(typeName).toLowerCase();
			System.out.println("NetUtil :NETTYPE="+temp);
			if (temp.indexOf(CONNECT_TYPE_WIFI) > -1)
			{// wifi
				type = CURRENT_NETWORK_TYPE_WIFI;
			}
			else if (temp.indexOf(CONNECT_TYPE_CTNET) > -1)
			{// ctnet
				type = CURRENT_NETWORK_TYPE_CTNET;
			}
			else if (temp.indexOf(CONNECT_TYPE_CTWAP) > -1)
			{// ctwap
				type = CURRENT_NETWORK_TYPE_CTWAP;
			}
			else if (temp.indexOf(CONNECT_TYPE_CMNET) > -1)
			{// cmnet
				type = CURRENT_NETWORK_TYPE_CMNET;
			}
			else if (temp.indexOf(CONNECT_TYPE_CMWAP) > -1)
			{// cmwap
				type = CURRENT_NETWORK_TYPE_CMWAP;
			}
			else if (temp.indexOf(CONNECT_TYPE_UNIWAP) > -1)
			{// uniwap
				type = CURRENT_NETWORK_TYPE_UNIWAP;
			}
			else if (temp.indexOf(CONNECT_TYPE_UNI3GWAP) > -1)
			{// 3gwap
				type = CURRENT_NETWORK_TYPE_UNIWAP;
			}
			else if (temp.indexOf(CONNECT_TYPE_UNINET) > -1)
			{// uninet
				type = CURRENT_NETWORK_TYPE_UNIET;
			}
			else if (temp.indexOf(CONNECT_TYPE_UNI3GNET) > -1)
			{// 3gnet
				type = CURRENT_NETWORK_TYPE_UNIET;
			}
		}
		return type;
	}
	
	/**
	 * @Title: getImsi
	 * @Description: 获取IMSI
	 * @param @param mContext
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 * @date 2014年2月7日 上午11:42:59
	 */
	public static String getImsi(Context mContext) {
		TelephonyManager mTelephonyMgr = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
		return mTelephonyMgr.getSubscriberId();
	}
	
	/**
	 * @Title: getImei
	 * @Description: 获取IMEI
	 * @param @param mContext
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 * @date 2014年2月7日 上午11:43:04
	 */
	public static String getImei(Context mContext) {
		TelephonyManager mTelephonyMgr = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
		return mTelephonyMgr.getDeviceId();
	}
	
	/**
	 * @Title: getUserAgent
	 * @Description: 获取浏览器UA信息
	 * @param @param context
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 * @date 2014年2月7日 上午10:30:53
	 */
	public static String getUserAgent(Context context, String newUA) {
		WebView mWebView = null;
		try
		{
			if (context == null) { return newUA; }
			mWebView = new WebView(context);
			return mWebView.getSettings().getUserAgentString();
		}
		catch (Exception e)
		{
			return newUA;
		}
		finally
		{
			if (mWebView != null)
			{
				mWebView.destroy();
				mWebView = null;
			}
		}
	}
	
	/**
	 * @Title: isNetworkConnected
	 * @Description: 判断是否有网络连接
	 * @param @param context
	 * @param @return 设定文件
	 * @return boolean 返回类型
	 * @throws
	 * @date 2014年1月26日 上午10:55:47
	 */
	public static boolean isNetworkConnected(Context context) {
		if (context != null)
		{
			ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
			NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
			if (mNetworkInfo != null) { return mNetworkInfo.isAvailable(); }
		}
		return false;
	}
	
	/**
	 * @Title: isWifiConnected
	 * @Description: 判断WIFI网络是否可用
	 * @param @param context
	 * @param @return 设定文件
	 * @return boolean 返回类型
	 * @throws
	 * @date 2014年1月26日 上午10:57:18
	 */
	public static boolean isWifiConnected(Context context) {
		if (context != null)
		{
			ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
			NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
			if (mWiFiNetworkInfo != null) { return mWiFiNetworkInfo.isAvailable(); }
		}
		return false;
	}
	
	/**
	 * 当网络为wifi时,直接返回空代理: 当ctwap,cmwap,uniwap,3gwap开启时同时开启wifi网络
	 * ,通过下面的getDefaultHost接口将得到对应wap网络代理ip ,这是错误的,所以在此判断当前网络是否为wifi
	 */
	public static String getNetworkProxyUrl(Context context) {
		if (NetUtil.isWifiConnected(context)) { return null; }
		return android.net.Proxy.getDefaultHost();
	}
	
	public static int getNetworkProxyPort() {
		return android.net.Proxy.getDefaultPort();
	}
	
	/**
	 * 是否需要设置代理(网络请求,一般用于wap网络,但有些机型设置代理会导致系统异常)
	 * 
	 * @return
	 */
	public static boolean isNeedSetProxyForNetRequest() {
		if (Build.MODEL.equals("SCH-N719") || Build.MODEL.equals("SCH-I939D"))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	/**
	 * @Title: isMobileConnected
	 * @Description: 判断MOBILE网络是否可用
	 * @param @param context
	 * @param @return 设定文件
	 * @return boolean 返回类型
	 * @throws
	 * @date 2014年1月26日 上午10:57:41
	 */
	public boolean isMobileConnected(Context context) {
		if (context != null)
		{
			ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
			NetworkInfo mMobileNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
			if (mMobileNetworkInfo != null) { return mMobileNetworkInfo.isAvailable(); }
		}
		return false;
	}
	
	/**
	 * 用来获取手机拨号上网（包括CTWAP和CTNET）时由PDSN分配给手机终端的源IP地址。
	 * 
	 * @return
	 * @author SHANHY
	 */
	public static String getPsdnIp() {
		try
		{
			for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
			{
				NetworkInterface intf = en.nextElement();
				for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();)
				{
					InetAddress inetAddress = enumIpAddr.nextElement();
					if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address)
					{
						//if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet6Address) {
						return inetAddress.getHostAddress().toString();
					}
				}
			}
		}
		catch (Exception e)
		{
		}
		return "";
	}
	
	/**
	 * @Title: checkSimExists
	 * @Description: 检查是否有sim卡
	 * @param @param context
	 * @param @return 设定文件
	 * @return boolean 返回类型
	 * @throws
	 * @date 2014年2月17日 下午9:32:06
	 */
	public static boolean checkSimExists(Context context) {
		TelephonyManager tm = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);//取得相关系统服务
		if (tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT)
		{
			return false;
		}
		else return true;
	}
}
